package com.stefan.bitmap;

/*
 * 方式二： 数组是int数组可以表示32bit（位）01表示法
 * 先要确定数组的length，则是max/32+1, 假如max是80，则byte数组的length就是3
 * 此时想一下，如果用int数组表示，那数组的长度是不是80
 * */
public class StefanBitMap1 {
    int[] elements;
    int max;

    public StefanBitMap1(int max) {
        this.max = max;
        elements = new int[(max >> 5) + 1]; //用max计算出在32位表示下的数组长度
    }
    public void add (int n) {
        int index = n >> 5; //找到n对应的数组下表
        int position = n & 31; // 找到对应的表示位
        //elements[index] |= 1 << position; //把表示位改成1
        elements[index] = elements[index] | (1 << position); //把表示位改成1
    }
    public boolean find (int n) {
        int index = n >> 5;//找到n对应的数组下表
        int position = n & 31;// 找到对应的表示位

        int flag = elements[index] & (1 << position); // 拿到表示位的值
        if (flag == 0) return false; //0的话表示不存在
        return true;

    }
    public void delete (int n) {
        int index = n >> 5;//找到n对应的数组下表
        int position = n & 31;// 找到对应的表示位

        elements[index] = elements[index] ^ (1 << position);// 把n表示位改成0
    }

    public static void main(String[] args) {
        StefanBitMap1 stefanBitMap1 = new StefanBitMap1(100);
        stefanBitMap1.add(10);
        stefanBitMap1.add(99);
        stefanBitMap1.add(18);
        stefanBitMap1.add(20);
        System.out.println(stefanBitMap1.find(99));
        System.out.println(stefanBitMap1.find(13));
        System.out.println(stefanBitMap1.find(40));
        System.out.println(stefanBitMap1.find(20));
        stefanBitMap1.delete(20);
        System.out.println(stefanBitMap1.find(20));
    }
}
